package interview.huawei.tjt.training.str;

import java.util.Scanner;

/**
 * 给定一个字符串，逐个翻转字符串中的每个单词。
 *
 * 示例 1：
 * 输入: "the sky is blue"
 * 输出: "blue is sky the"
 *
 * 示例 2：
 * 输入: "  hello world!  "
 * 输出: "world! hello"
 * 解释: 输入字符串可以在前面或者后面包含多余的空格，但是反转后的字符不能包括。
 *
 * 示例 3：
 * 输入: "a good   example"
 * 输出: "example good a"
 * 解释: 如果两个单词间有多余的空格，将反转后单词间的空格减少到只含一个。
 */
public class ReverseWords {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            StringBuffer stringBuffer = removeSpace(scanner.nextLine());
            reverseAll(stringBuffer, 0, stringBuffer.length() - 1);
            reverseEachWord(stringBuffer);
            System.out.println(stringBuffer.toString());
        }
    }

    // 去除多余的空格
    private static StringBuffer removeSpace (String s) {
        StringBuffer stringBuffer = new StringBuffer();
        int start = 0;
        int end = s.length() - 1;
        while (s.charAt(start) == ' ')
            start ++;
        while (s.charAt(end) == ' ')
            end --;
        while (start <= end) {
            char ch = s.charAt(start);
            if (ch != ' ' || s.charAt(stringBuffer.length() - 1) != ' ') {
                stringBuffer.append(ch);
            }
            start ++;
        }
        return stringBuffer;
    }

    // 反转整个字符串
    private static void reverseAll (StringBuffer stringBuffer, int start, int end) {
        while (start <= end) {
            char ch = stringBuffer.charAt(start);
            stringBuffer.setCharAt(start,stringBuffer.charAt(end));
            stringBuffer.setCharAt(end, ch);
            start ++;
            end --;
        }
    }

    // 反转每个单词
    private static void reverseEachWord (StringBuffer stringBuffer) {
        int start = 0;
        int end = 1;
        while (start <= stringBuffer.length() - 1) {
            while (end < stringBuffer.length() && stringBuffer.charAt(end) != ' ')
                end ++;
            reverseAll(stringBuffer, start, end - 1);
            start = end + 1;
            end = start + 1;
        }
    }

}
